跳到主要内容

使用 ELK 的日志中心设计

因为看了很多开源项目都有日志中心这个东西,所以摸索学习,研究下微服务中的日志中心怎么设计~

这篇笔记主要使用 Elastic Search,Logstash 和 Kibana

为什么需要日志系统

在大型系统的微服务化构建中,一个系统会被拆分成许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种构建形式中,开发者一般会聚焦于最大程度解耦模块的功能以减少模块间耦合带来的额外开发成本。同时,微服务面临着如何部署这些大量的服务系统、如何运维这些系统等新问题。

微服务架构中的日志收集方案 ELK(ELK 是 Elasticsearch、Logstash、Kibana 的简称),准确的说是 ELKB,即 ELK + Filebeat,其中 Filebeat 是用于转发和集中日志数据的轻量级传送工具。

什么是 ELK

  • Elasticsearch 是一种基于 JSON 的分布式搜索和分析引擎,提供水平可扩展性,为高可靠性和易管理性而设计。
  • Logstash 是一个动态数据收集管道,具有可扩展的插件生态系统和强大的 Elasticsearch 协同作用。
  • Kibana 通过 UI 提供数据可视化。

这里重点介绍下 Logstash

其实 Logstash 的作用就是一个数据收集器,将各种格式各种渠道的数据通过它收集解析之后格式化输出到 Elasticsearch ,最后再由 Kibana 提供的比较友好的 Web 界面进行汇总、分析、搜索。

ELK 内部实际就是个管道结构,数据从 Logstash 到 Elasticsearch 再到 Kibana 做可视化展示。这三个组件各自也可以单独使用,比如 Logstash 不仅可以将数据输出到 Elasticsearch ,也可以到数据库、缓存等。

配置环境

使用 Docker 来安装环境

version: "3.1"
services:
elasticsearch:
image: daocloud.io/library/elasticsearch:6.8.11
# restart: always
container_name: elasticsearch
ports:
- 9200:9200
environment:
- ES_JAVA_OPTS=-Xms64m -Xmx128m
- discovery.type=single-node
- COMPOSE_PROJECT_NAME=elasticsearch-server
networks:
- esnet
# kibana 是 ES 的图形化界面
kibana:
image: daocloud.io/library/kibana:6.8.10
# restart: always
container_name: kibana
ports:
- 5601:5601
environment:
- environment_url=http://elasticsearch:9200
networks:
- esnet
# 等待 elasticsearch 启动了再启动
depends_on:
- elasticsearch
# logstash 用于采集日志
logstash:
image: logstash:6.8.10
container_name: logstash
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
- ./logstash/pipeline:/usr/share/logstash/pipeline
ports:
- 5044:5044
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- esnet
depends_on:
- kibana
- elasticsearch
networks:
esnet:
driver: bridge

说明:这里要挂载两个文件夹,一个是 logstash 的管道 pipeline 的配置文件夹,一个是 logstash 自身的配置文件,5044 端口是为了接受 filebeat 传过来数据,depends_on 是为了在 elasticsearch 和 kibana 服务启动之后再启动该容器

config 下的 logstash.yml 配置

vim ./logstash/config/logstash.yml
http.host: "0.0.0.0"

默认配置基本上够用了,只用设置一个 host 就行了

pipeline 的管道配置文件 logstash.conf

vim ./logstash/pipeline/logstash.conf
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["127.0.0.1:9200"]
}
}

配置说明:input 接收 beat 的数据,filter 是对数据进行操作,可以配置格式,新增常用字段等,output 是输出索引的地址,一般就是 elasticsearch,如果 elasticsearch 的 hosts 有多个地址,会自动负载均衡

然后启动容器:

docker-compose up -d

补充:ElasticSearch 默认是关闭远程连接的,需要修改 ES 的配置文件

cd /usr/share/elasticsearch/config
vi elasticsearch.yml

注意:要先关掉 ElasticSearch,因为在它运行时,这个配置是只读的

# 把加在这个配置前的注释去掉
transport.host: 0.0.0.0

# 因为 ElasticSearch 这里可能是集群,所以最好写上它的名称
cluster.name: my-application

# 然后开启跨域
http.cors.enabled: true
http.cors.allow-origin: "*"

network.host: 127.0.0.1 # 这里改成当前主机的地址

检查是否启动成功

http://localhost:9600/

使用安装包安装

因为魔法的问题,老是无法下载 logstash 的镜像,所以这里手动下载安装(ES 那些还是使用 Docker)

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.10.tar.gz